//******************************************************************************
/**
 *
 * @file	sheimi_form_rev.c
 * @brief	連れ歩きシェイミフォルム戻り
 * @author	saito
 * @data	09.03.26
 *
 * モジュール名：SheimiFrmRev_
 *
 */
//******************************************************************************

#include "common.h"
#include "fieldsys.h"
#include "fieldobj.h"
#include "battle/battle_server.h"		//for FORMNO_SHEIMI_NORMAL
#include "ev_pokemon.h"					//for EvPoke_GetLivingPokemonTop
#include "sheimi_frm_rev_def.h"
#include "sheimi_form_rev.h"
#include "pair_poke.h"

typedef struct {
	int Frame;
	EOA_PTR eoa;
	BOOL DummyChg;
}CHG_WORK;

static BOOL ChangeShaimeNormalFormEvt(GMEVENT_CONTROL * event);

//--------------------------------------------------------------
/**
 * シェイミフォルムチェック
 * @param	fsys	フィールドシステムポインタ
 * @return	BOOL
 */
//--------------------------------------------------------------
BOOL SheimiFrmRev_CheckForm(FIELDSYS_WORK *fsys)
{
	if ( !FieldOBJ_AcmdSetCheck(Player_FieldOBJGet( fsys->player )) ){
		return FALSE;
	}


	if ( PairPoke_IsPairPoke(fsys) ){
		//連れ歩きはシェイミ？
		if (fsys->PairPokeWork.MonsNo == MONSNO_EURISU){
			//手持ちパーティ取得
			POKEPARTY *my_party = SaveData_GetTemotiPokemon(fsys->savedata);
			POKEMON_PARAM *pp = EvPoke_GetLivingPokemonTop(my_party);
			//モンスターナンバーを取得
			int monsno = PokeParaGet(pp,ID_PARA_monsno,NULL);
			//フォルムナンバーを取得
			int formno = PokeParaGet(pp,ID_PARA_form_no,NULL);

			GF_ASSERT(monsno == fsys->PairPokeWork.MonsNo);
			if (monsno != fsys->PairPokeWork.MonsNo){
				return FALSE;
			}
			//ポケモンパラムのフォルムがランドで、
			//連れ歩きのフォルムがスカイの場合は、ランドに戻すイベント発行
			if ( (fsys->PairPokeWork.Form ==FORMNO_SHEIMI_FLOWER)&&(formno==FORMNO_SHEIMI_NORMAL) ){
				return TRUE;
			}
		}
	}
	return FALSE;
}


//--------------------------------------------------------------
/**
 * シェイミフォルム戻りイベントセット
 * @param	event		イベントポインタ
 * @return	none
 */
//--------------------------------------------------------------
void SheimiFrmRev_CallEvt(GMEVENT_CONTROL * event)
{
	CHG_WORK *work = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(CHG_WORK));
	//イベント発行
	FieldEvent_Call(event, ChangeShaimeNormalFormEvt, work);
}

//----------------------------------------------------------------------------
/**
 *	@brief	シェイミをランドフォルムにするイベント
 *
 *	@param	* event		イベントポインタ
 *
 *	@return	BOOL		TRUE:終了　FALSE:継続
 */
//-----------------------------------------------------------------------------
static BOOL ChangeShaimeNormalFormEvt(GMEVENT_CONTROL * event)
{
	int *seq = FieldEvent_GetSeqWork(event);
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	CHG_WORK* chg_work = FieldEvent_GetSpecialWork(event);

	switch(*seq){
	case 0:
		//連れ歩きポーズクリア
		FieldOBJ_MovePauseClear( PairPoke_GetFldObjPtr(fsys) );
		//連れ歩きポケモン移動待ち
		FieldEvent_Call(fsys->event, PairPokeEvAnm_WaitAnmEvent, NULL);
		(*seq)++;
		break;
	case 1:
		{
			//フォルム戻りエフェクト開始
			VecFx32 vec;
			//連れ歩きポケモン座標取得
			FieldOBJ_VecPosGet( PairPoke_GetFldObjPtr(fsys), &vec );
			//連れ歩き表示？
			if ( PairPoke_IsVisible(fsys) ){
				chg_work->eoa = FE_FChg_Add( fsys->fes, &vec );
				chg_work->DummyChg = TRUE;
			}else{
				chg_work->eoa = NULL;
				chg_work->DummyChg = FALSE;
			}
			chg_work->Frame = 0;

			OS_Printf("シェイミのカラー%d\n",fsys->PairPokeWork.Rare);

			//連れ歩き情報書き換え
			PairPoke_SetInfo(fsys->PairPokeWork.FldObj, MONSNO_EURISU, 0, fsys->PairPokeWork.Rare);
		}
		(*seq)++;
		break;
	case 2:
		if (chg_work->DummyChg){
			chg_work->Frame++;
			if (chg_work->Frame >= FORM_CHANGE_FRAME){
				FieldOBJ_BlActDummyDrawReset( fsys->PairPokeWork.FldObj, HR_PAIR_POKE536 );	//シェイミランドフォルム
				(*seq)++;
			}
		}else{
			CONST_FIELD_OBJ_SYS_PTR fos = FieldOBJ_FieldOBJSysGet( fsys->PairPokeWork.FldObj );
			int old = FieldOBJ_OBJCodeGet( fsys->PairPokeWork.FldObj );
			FieldOBJ_DrawDelete( fsys->PairPokeWork.FldObj );
			FieldOBJ_BlActResm_ResIDGuestUseCheckDelete( fos, old, fsys->PairPokeWork.FldObj );
			FieldOBJ_DrawResetAlone( fsys->PairPokeWork.FldObj, HR_PAIR_POKE536 );	//シェイミランドフォルム
			(*seq)++;
		}
		break;
	case 3:
		if (FieldOBJ_BlActAddPracFlagCheck(fsys->PairPokeWork.FldObj)==FALSE ){
			fsys->PairPokeWork.Form = FORMNO_SHEIMI_NORMAL;
			(*seq)++;
		}
		break;
	case 4:
		{
			u8 end = 0;
			if ( chg_work->eoa == NULL ){
				end = 1;
			}else{
				if ( FE_FChg_EndCheck( chg_work->eoa ) ){
					EOA_Delete( chg_work->eoa );
					end = 1;
				}
			}

			if (end){
				//ワーク削除
				sys_FreeMemoryEz(chg_work);
				//連れ歩きポーズ
				FieldOBJ_MovePause( PairPoke_GetFldObjPtr(fsys) );
				return TRUE;
			}
		}
	}
	return FALSE;
}
